package classTest.HomeWorkday04;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
import java.util.Scanner;

/**
 * 完成修改昵称工作
 *
 * 程序启动后，要求用户输入用户名和新的昵称
 * 然后修改user.dat文件中该用户的昵称
 * 如果输入的用户不存在，则输出"查无此人"
 *
 * 思路:
 * 可以分几步实现:
 * 1:首先获取用户输入的用户名和新的昵称
 * 2:尝试循环读取user.dat文件中的每个用户名并打桩输出到控制台
 * 3:在读取用户名没有问题后，加上一个判断，判断该用户名是否为当前
 *   用户输入的用户名，匹配上则打桩输出
 * 4:如果匹配测试没问题，在分支中将指针移动到这条记录的昵称位置，
 *   需要思考昵称位置的计算。
 *   然后将昵称转换为字节后扩容到32字节写入覆盖即可。
 * @author Xiloer
 *
 */
public class Test02 {
    public static void main(String[] args) throws IOException {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入用户名");
        String username=scanner.nextLine();
        System.out.println("请输入新的昵称");
        String nickname=scanner.nextLine();

        //打开Raf找到user.txt文件中的该用户
        RandomAccessFile raf =new RandomAccessFile("user.txt","rw");
        boolean update=false;//标记是否有昵称被修改过，默认是没有记录被修改
        for (int i = 0; i <raf.length()/100 ; i++) {
            //先将指针移动到该条记录的开始位置
            raf.seek(i*100);
            //读取用户名
            byte[]data=new byte[32];
            raf.read(data);//将用户名的32个字节读入数组
            String name =new String(data,"UTF-8").trim();
            //是否为该用户
            if(name.equals(username)){
                //修改该用户昵称
                //将指针移动到昵称的位置
                raf.seek(i*100+64);
                //将新的昵称写入来覆盖旧昵称
                data=nickname.getBytes("UTF-8");//转换成字节码
                data= Arrays.copyOf(data,32);//将字节码扩容到32位
                raf.write(data);
                update=true;
                break;//停止后继续循环
            }
        }
        if(update){
            System.out.println("修改完成");
        }else {
            System.out.println("查无此人");
        }
//      用完关闭！！
        raf.close();
    }
}
